//
//  EmoticonViewController.swift
//  04CZemoticon
//
//  Created by ksl on 15/12/6.
//  Copyright © 2015年 ksl. All rights reserved.
//

import UIKit

/*
    当控制器的view作为自定键盘时:
        在自定义键盘还没有显示的时候,就会执行viewDidLoad
        在viewDidLoad里面,控制器的view的大小是屏幕大小

        在viewWillAppear里面,控制器的view的大小是屏幕大6小

        在viewDidAppear里面,控制器的view的大小是自定义键盘的大小
*/


class EmoticonViewController: UIViewController {

    //MARK: 属性
    ///要添加表情图片的 textView,textView 不需要强引用
    weak var textView: UITextView?
    
    ///cell 的重用标示
    private let ReuseIdentifier = "EmoticonCell"
    
    ///设置按钮选中属性
    private var selectedButton: UIButton?
    
    //基础 tag,因为 tag==0 默认为 toolBar,所以要为 tag 增加一个数值,以区分 toolBar 和表情包按钮
    private let bassTag = 1000
    
    ///所有表情包模型
    private let packages = EmoticonPackage.loadPackage()
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        prepareUI()
        
    }

    //MARK: 准备 UI
    ///准备 UI
    private func prepareUI() {
        
        //添加子控件
        view.addSubview(collectionView)
        view.addSubview(toolBar)
        
        //添加约束,少依赖第三方
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        toolBar.translatesAutoresizingMaskIntoConstraints = false
        
        //VFL
        //collectionView 水平方向,左右都距离父控件 0
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[collectionView]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["collectionView": collectionView]))
        
        //toolBar 水平方向,左右都距离父控件 0
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[toolBar]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["toolBar": toolBar]))
        
        // 垂直方向.
        // 1.collectionView顶部和父控件顶部重合.
        // 2.collectionView底部和toolBar顶部重合
        // 3.toolBar高度44
        // 4.toolBar底部和父控件重合
        // [tb(44)] 44表示宽度还是高度,看前面的方向是H还是V, H: 宽44, V: 高度44
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[collectionView]-0-[toolBar(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["collectionView": collectionView, "toolBar": toolBar]))
        
        //设置 toolBar 内容
        setupToolBar()
        
        //设置collectionView
        setupCollectionView()
    }
    
    //设置 toolBar 内容
    private func setupToolBar() {
    
        var items = [UIBarButtonItem]()
        
        //按钮的 tag
        var index = bassTag
        
        //获取表情包模型的名称
        for package in packages {
            //获取每个表情包的名称
            let title = package.group_name_cn
            
            //创建按钮
            let button = UIButton()
            
            //设置文字
            button.setTitle(title, forState: UIControlState.Normal)
            
            //设置颜色
            button.setTitleColor(UIColor.lightGrayColor(), forState: UIControlState.Normal)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Highlighted)
            button.setTitleColor(UIColor.darkGrayColor(), forState: UIControlState.Selected)
            
            //按钮适应文字大小
            button.sizeToFit()
            
            //添加点击事件
            button.addTarget(self, action: "itemClick:", forControlEvents: UIControlEvents.TouchUpInside)
            
            //设置 tag
            button.tag = index
            
            //最近表情包默认为高度
            if index == bassTag {
                switchSelectionButton(button)
            }
            
            
            //创建UIBarButtonItem
            let item = UIBarButtonItem(customView: button)
            
            //添加 item 到数组
            items.append(item)
            
            //添加弹簧
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
            
            index++
        }
        
        //移除最后一个弹簧
        items.removeLast()
        
        //把 items 数组赋值给 toolBar
        toolBar.items = items
        
    }
    
    //MARK: - 按钮点击事件
    func itemClick(button: UIButton) {
        print("点击按钮: \(button.tag)")
        
        //切换到对应的表情包的第一页表情
        //section 需要 tag 的起始值
        let indexPath = NSIndexPath(forItem: 0, inSection: button.tag - bassTag)
        
        //indexPath 来实现表情包页面跳转
        collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.Left)
        
        //也可以用下面这个方法来实现页面跳转
//        collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
        
        //让点击的按钮高亮
        switchSelectionButton(button)
        
    }
    
    /**
     切换选中的按钮,让按钮高亮
     
     - parameter button: 要选中的按钮
     */
    private func switchSelectionButton(button: UIButton) {
        //三件事,
        
        //1.取消原选中的按钮
        selectedButton?.selected = false
        
        //2.选中传的按钮
        button.selected = true
        
        //3.赋值
        selectedButton = button
    }
    
    
    //设置collectionView
    private func setupCollectionView() {
    
        //设置背景
        collectionView.backgroundColor = UIColor(white: 0.8, alpha: 1)
        
        //注册 cell
        collectionView.registerClass(EmoticonCell.self, forCellWithReuseIdentifier: ReuseIdentifier)
        
        //数据源和代理
        collectionView.dataSource = self
        
        //设置代理
        collectionView.delegate = self
    }
    
    //MARK: - 懒加载
    ///collectionView
    private lazy var collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: EmojiconLayout())
    
    ///toolBar
    private lazy var toolBar: UIToolbar = UIToolbar()
}

//自定义流水布局,在 prepareLayout 里面来设置布局参数
class EmojiconLayout: UICollectionViewFlowLayout {
    
    //在CollectionView的 layout 将要布局的时候会调用,在这里设置布局参数
    override func prepareLayout() {
        //根据 collection 的大小来设置 layout 的大小
        let width = collectionView!.bounds.width / 7
        let height = collectionView!.bounds.height / 3
        
        //设置 layout 的 item 大小
        itemSize = CGSize(width: width, height: height)
        
        //collectionView 水平滚动
        scrollDirection = UICollectionViewScrollDirection.Horizontal
        
        //collectionView的 cell 不要间距
        minimumInteritemSpacing = 0
        minimumLineSpacing = 0
        
        //取消弹簧效果
        collectionView?.bounces = false
        
        //不要滚动条
        collectionView?.showsHorizontalScrollIndicator = false
        
        //分页
        collectionView?.pagingEnabled = true
    }
}

//swift 中只有实现协议方法,才不会报错
extension EmoticonViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    
    //返回组
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        //有几个表情包,就返回几组
        return packages.count
    }
    
    //某一组,显示多少条数据
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        //获取到第一组对应的表情包模型
        let package = packages[section]
        return package.emoticons.count
    }

    //返回 cell
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        //获取 cell,先去缓存池中查找,如果找不到,就通过注册 的 cel 类型来创建 cell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! EmoticonCell
        
        //获取表情包里面的表情,组(section) -> 表情包 , indexPath.item -> 某个表情
        let emoticon = packages[indexPath.section].emoticons[indexPath.item]
        
        //设置 cell 的模型
        cell.emoticon = emoticon
        
        return cell
    }
    
    //监听 collectionView 停止滚动
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        //判断显示的是哪个表情包
        //获取 collectionView 正在显示的 cell 的 indexPath
        let indexPath = collectionView.indexPathsForVisibleItems().first!
        
        print("当前显示的表情包: \(indexPath.section)")
        // indexPath?.section 和 表情包按钮.tag是对应的
        
        // 通过tag找到对应的表情包按钮
        // 通过view.tag来查找view,遍历toolBar查找tag = indexPath.section的view.
        // 先查找自己,如果自己不是,在遍历子控件查找
        // view的tag默认是0
        
        // 按钮的tag是从1000(baseTag)开始的.
        let button = toolBar.viewWithTag(indexPath.section + self.bassTag) as! UIButton
        
        //判断到是在哪个表情包后,让对应的按钮高亮
        switchSelectionButton(button)
    }
    
    ///collectionView 的某个 cell 被点击
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
//        print("cell被点击: \(indexPath)")
        
        //获取到被点击的表情模型
        let emoticon = packages[indexPath.section].emoticons[indexPath.item]
        
        //把表情插入到 textView
        textView?.insertEmoticon(emoticon)
        
    }
    
}

//自定义表情键盘的 cell
class EmoticonCell: UICollectionViewCell {
    
    //cell 显示什么内容,根据表情模型
    var emoticon: Emoticon? {
        didSet {
            //视图根据模型来显示内容
            
//            print("emoticon?.pngPath: \(emoticon?.pngPath)")
            
            if emoticon?.png != nil {
                //设置表情图片
                //contentsOfFile: 不会缓存,使用完就释放
                //named: 一直缓存在内存中
                emoticonButton.setImage(UIImage(contentsOfFile: emoticon!.pngPath!), forState: UIControlState.Normal)
            } else {//没有图片,把按钮的图片设置为 nil
                emoticonButton.setImage(nil, forState: UIControlState.Normal)
            }
            emoticonButton.setTitle(emoticon?.emoji, forState: UIControlState.Normal)
            
            //如果是删除按钮,显示删除按钮图片
            if emoticon!.removeEmoticon {
                emoticonButton.setImage(UIImage(named: "compose_emotion_delete"), forState: UIControlState.Normal)
            }
        }
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //这个 frame 是有值 的
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        prepareUI()
    }
    
    //准备 UI
    private func prepareUI() {
        
        //设置按钮背景颜色
//        emoticonButton.backgroundColor = UIColor.brownColor()
        
        //添加子控件
        contentView.addSubview(emoticonButton)
        
        //设置按钮的大小
        emoticonButton.frame = CGRectInset(bounds, 6, 6)
        
        //设置字体的大小
        emoticonButton.titleLabel?.font = UIFont.systemFontOfSize(32)
        
        //禁止按钮可以和用户交互
        emoticonButton.userInteractionEnabled = false
    }
    
    //MARK: - 懒加载
    //r 按钮,显示图片,或文字
    private lazy var emoticonButton = UIButton()
}

